#===istalismanplugin===
# -*- coding: utf-8 -*-

# $Revision: 54 $
# $Author: rchiganov@gmail.com $
# $Date: 2013-08-05 07:16:38 +0000 (Mon, 05 Aug 2013) $

#  Talisman plugin
#  macro_plugin.py

#  Initial Copyright © 2007 dimichxp <dimichxp@gmail.com>
#  Modifications Copyright © 2007 Als <Als@exploit.in>

#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

#---------------------------------------------------------------------------------------------------

def macro_add ( type, source, parameters ):
	if not GROUPCHATS.has_key(source[1]):
		return

	pl = MACROS.parse_cmd(parameters)
	if (len(pl)<2):
		reply(type, source, u'мало аргументов')
		return
	else:
		if pl[1].split()[0] in COMMAND_HANDLERS or pl[1].split()[0] in MACROS.gmacrolist or pl[1].split()[0] in MACROS.macrolist[source[1]]:
			real_access = MACROS.get_access(pl[1].split()[0], source[1])
			if real_access < 0 and pl[1].split()[0] in COMMAND_HANDLERS:
				real_access = COMMANDS[pl[1].split()[0]]['access']
			else:
				pass
			if real_access:
				if not has_access(source, real_access, source[1]):
					reply(type, source, u'размечтался ]:->')
					return
		else:
			reply(type, source, u'не вижу команду внутри макроса')
			return
		MACROS.add(pl[0], pl[1], source[1])
		MACROS.flush()
		reply(type, source, u'добавила')
	
#---------------------------------------------------------------------------------------------------

def gmacro_add ( type, source, parameters ):
	pl = MACROS.parse_cmd(parameters)
	if (len(pl)<2):
		rep = u'мало аргументов'
	else:
		MACROS.add(pl[0], pl[1])
		write_file('dynamic/macros.txt', str(MACROS.gmacrolist))
		rep = u'добавила'
	reply(type, source, rep)

#---------------------------------------------------------------------------------------------------

def macro_del ( type, source, parameters ):
	if not GROUPCHATS.has_key(source[1]):
		return

	if parameters:
		MACROS.remove(parameters, source[1])
		MACROS.flush()
		rep = u'убила'
	else:
		rep = u'мало аргументов'
	reply(type, source, rep)
	
#---------------------------------------------------------------------------------------------------

def gmacro_del ( type, source, parameters ):
	if parameters:
		MACROS.remove(parameters)
		write_file('dynamic/macros.txt', str(MACROS.gmacrolist))
		rep = u'убила'
	else:
		rep = u'мало аргументов'
	reply(type, source, rep)

#---------------------------------------------------------------------------------------------------

def macro_expand ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		return

	if pparameters:
		lrep = MACROS.comexp(pparameters, psource)
		if not lrep:
			lrep = u'не экспандится, прав маловато?'
	else:
		lrep = u'мало аргументов'
	reply(ptype, psource, lrep)

#---------------------------------------------------------------------------------------------------

def gmacro_expand ( ptype, psource, pparameters ):
	if pparameters:
		lrep = MACROS.comexp(pparameters, psource, '1')
	else:
		lrep = u'мало аргументов'
	reply(ptype, psource, lrep)

#---------------------------------------------------------------------------------------------------

def macro_info ( type, source, parameters ):
	if not GROUPCHATS.has_key(source[1]):
		return

	rep = ''
	if parameters:
		try:
			if MACROS.macrolist[source[1]].has_key(parameters):
				rep = parameters+' -> '+MACROS.macrolist[source[1]][parameters]
		except:
			rep = u'нет такого макроса'
	elif parameters == 'всемакро':
		rep += '\n'.join([x + ' -> ' + MACROS.macrolist[source[1]][x] for x in MACROS.macrolist[source[1]]])
	if not rep:
		rep = u'мало прав'
	reply(type, source, rep)

#---------------------------------------------------------------------------------------------------

def gmacro_info ( type, source, parameters ):
	rep = ''
	if parameters:
		if MACROS.gmacrolist.has_key(parameters):
			rep = parameters+' -> '+MACROS.gmacrolist[parameters]
		else:
			rep = u'нет такого макроса'
	elif parameters == 'всемакро':
		rep += '\n'.join([x + ' -> ' + MACROS.macrolist[x] for x in MACROS.macrolist])
	reply(type, source, rep)

#---------------------------------------------------------------------------------------------------

# Выводим список макросов
def macro_list ( type, source, parameters ):
	lrep, dsbll, dsblg, glist, llist = u'Cписок макросов:', [], [], [], []

	lrep += u'\n\nЛОКАЛЬНЫЕ МАКРОСЫ:'
	if MACROS.macrolist.has_key(source[1]):
		for lmacro in MACROS.macrolist[source[1]].keys():
			if COMMOFF.has_key(source[1]):
				if lmacro in COMMOFF[source[1]]:
					dsbll.append(lmacro)
				else:
					llist.append(lmacro)
			else:
				llist.append(lmacro)
		dsbll.sort()
		llist.sort()
		if len(llist) != 0:
			lrep += u'\n' + u', '.join(llist)
		if len(dsbll) != 0:
			lrep += u'\n\nЗдесь отключены:\n' + u', '.join(dsbll)
	else:
		lrep += u'\nНет локальных макросов'

	lrep += u'\n\nГЛОБАЛЬНЫЕ МАКРОСЫ:'
	for lmacro in MACROS.gmacrolist.keys():
		if COMMOFF.has_key(source[1]):
			if lmacro in COMMOFF[source[1]]:
				dsblg.append(lmacro)
			else:
				glist.append(lmacro)
		else:
			glist.append(lmacro)
	dsblg.sort()
	glist.sort()
	if len(glist) != 0:
		lrep += u'\n' + u', '.join(glist)
	if len(dsblg) != 0:
		lrep += u'\n\nЗдесь отключены:\n' + u', '.join(dsblg)

	if type == 'public':
		reply(type, source, u'в привате')
	reply('private', source, lrep)

#---------------------------------------------------------------------------------------------------

def macro_access ( type, source, parameters ):
	if not GROUPCHATS.has_key(source[1]):
		return

	if parameters:
		args, access = parameters.split(' '), 10
		if len(args) == 2:
			macro = args[0]
			if macro in COMMAND_HANDLERS:
				if not user_level(source, source[1]) == 100:
					reply(type, source, u'размечтался ]:->')
					return
				else:
					pass
			elif macro in MACROS.gmacrolist or macro in MACROS.macrolist[source[1]]:
				real_access = MACROS.get_access(macro, source[1])
				if real_access < 0:
					pass
				else:
					if not has_access(source, real_access, source[1]):
						reply(type, source, u'размечтался ]:->')
						return
			try:
				access = int(args[1])
			except:
				reply(type, source, u'синтакс инвалид')
				return
			MACROS.give_access(macro, access, source[1])
			reply(type, source, u'дала')
			time.sleep(1)
			MACROS.flush()
		else:
			reply(type, source, u'что за бред?')

#---------------------------------------------------------------------------------------------------

def gmacro_access ( ptype, psource, pparameters ):
	if pparameters:
		largs = pparameters.split(' ')
		if len(largs) == 2:
			lmacro = largs[0]
			laccess = largs[1]
			MACROS.give_access(lmacro, laccess)
			reply(ptype, psource, u'дала')
			time.sleep(1)
			write_file('dynamic/macroaccess.txt', str(MACROS.gaccesslist))
		else:
			reply(ptype, psource, u'что за бред?')

#---------------------------------------------------------------------------------------------------

register_command_handler(gmacro_info, 'глобмакроинфо', ['суперадмин', 'макро', 'инфо', 'все'], 100, 'Открыть макро (любое), т.е. просто посмотреть как выглядит макро. Чтобы посмотреть на все макро напишите вместо названия определённого макро "всемакро" без кавычек.', 'глобмакроинфо [название]', ['глобмакроинфо глюк','глобмакроинфо всемакро'])
register_command_handler(gmacro_expand, 'глобмакрокод', ['суперадмин', 'макро', 'инфо', 'все'], 100, 'Развернуть макро, т.е. посмотреть на него в сыром виде.', 'глобмакрокод [название] [параметры]', ['глобмакрокод админ бот'])
register_command_handler(gmacro_access, 'глобмакродоступ', ['суперадмин', 'макро', 'все'], 100, 'Изменить доступ к определённому макро (любому).', 'глобмакродоступ [макро] [доступ]', ['глобмакродоступ админ 20'])
register_command_handler(gmacro_add, 'глобмакро+', ['суперадмин', 'макро', 'все'], 100, 'Добавить макро глобально. Само макро должно быть заключено в апострофы ``!!!', 'глобмакро+ [название] [`макро`]', ['глобмакро+ глюк `сказать /me подумал, что все глючат`'])
register_command_handler(gmacro_del, 'глобмакро-', ['суперадмин', 'макро', 'все'], 100, 'Удалить глобальное макро.', 'глобмакро- [название]', ['глобмакро- глюк'])

register_command_handler(macro_info, 'макроинфо', ['админ', 'макро', 'инфо', 'все'], 20, 'Открыть макро, т.е. просто посмотреть как выглядит макро. Чтобы посмотреть на все макро напишите вместо названия определённого макро "всемакро" без кавычек.', 'макроинфо [название]', ['макроинфо глюк', 'макроинфо всемакро'])
register_command_handler(macro_expand, 'макрокод', ['админ', 'макро', 'инфо', 'все'], 20, 'Развернуть макро, т.е. посмотреть на готовое макро в сыром виде.', 'макрокод [название] [параметры]', ['макрокод админ бот'])
register_command_handler(macro_access, 'макродоступ', ['админ', 'макро', 'все'], 20, 'Изменить доступ к определённому макро.', 'макродоступ [макро] [доступ]', ['макродоступ глюк 10'])
register_command_handler(macro_add, 'макро+', ['админ', 'макро', 'все'], 20, 'Добавить локальный макрос. Само макро должно быть заключено в апострофы ``!!!', 'макро+ [название] [`макро`]', ['макро+ глюк `сказать /me подумал, что все глючат`'])
register_command_handler(macro_del, 'макро-', ['админ', 'макро', 'все'], 20, 'Удалить макрос.', 'макро- [название]', ['макро- глюк'])

register_command_handler(macro_list, 'макролист', ['хелп', 'макро', 'инфо', 'все'], 10, 'Список макросов.', 'макролист', ['макролист'])

#---------------------------------------------------------------------------------------------------
